#define DEBUG
#include <cstdio>
#include <cstring>

using namespace std;

typedef long long ll;

const int mods=998244353, g=3, maxsize=16384, maxn=8000, maxm=200;

ll qpower(ll a, int n) {
  ll s=1;
  for (; n>1; n/=2) {
    if (n&1) {
      s = s*a%mods;
    }
    a = a*a%mods;
  }
  return a*s%mods;
}

const int unmaxsize=qpower(maxsize, mods-2);

ll getW(int n) {
  return qpower(g, (mods-1)/n);
}

void initPos(int n, int pos[]) {
  int len=0;
  for (; (1<<len)<n; len++);
  len--;
  for (int i=0; i<n; i++) {
    pos[i] = (pos[i>>1]>>1)|((i&1)<<len);
  }
}

void ntt(ll a[], int n, int pos[], bool rev) {
  for (int i=0; i<n; i++) {
    if (i<pos[i]) {
      ll t=a[i];
      a[i] = a[pos[i]], a[pos[i]]=t;
    }
  }

  for (int len=1; len<n; len*=2) {
    ll w = qpower(getW(len*2), rev ? mods-2 : 1);
    for (int i=0; i<n; i+=2*len) {
      ll t=1;
      for (int j=0; j<len; j++) {
	ll x=a[i+j], y=a[i+len+j]*t%mods;
	a[i+j] = (x+y)%mods;
	a[i+len+j] = (x+mods-y)%mods;
	t = t*w%mods;
      }
    }
  }
}

ll fact[maxn+3], unfact[maxn+3];

void initFact(int n) {
  fact[0] = 1;
  for (int i=1; i<=n; i++) {
    fact[i] = fact[i-1]*i%mods;
  }
  unfact[n] = qpower(fact[n], mods-2);
  for (int i=n; i>0; i--) {
    unfact[i-1] = unfact[i]*i%mods;
  }
}

// n>m
ll calcC(int n, int m) {
  if (n<m) {
    return 0;
  }
  return fact[n]*unfact[m]%mods*unfact[n-m]%mods;
}

int main() {
  freopen("matrix.in", "r", stdin);
  freopen("matrix.out", "w", stdout);

  int n, m;
  scanf("%d %d", &n, &m);
  initFact(maxn+2);

  static ll cnt[maxn+1][maxm+1], f[maxsize], g[maxsize], h[maxsize];
  static int pos[maxsize];
  initPos(maxsize, pos);
  for (int i=1; i<=n; i++) {
    g[i] = unfact[i+2]%mods;
  }
  ntt(g, maxsize, pos, false);

  cnt[0][0] = 1;
  for (int j=0; j<m; j++) {
    for (int i=0; i<=n; i++) {
      cnt[i][j+1] = cnt[i][j]*((1+i+calcC(i, 2))%mods)%mods;
    }

    memset(f, 0, sizeof f);
    for (int i=0; i<=n; i++) {
      f[i] = cnt[i][j]*unfact[i]%mods;
    }
    ntt(f, maxsize, pos, false);
    for (int i=0; i<maxsize; i++) {
      h[i] = g[i]*f[i]%mods;
    }
    ntt(h, maxsize, pos, true);
    for (int i=0; i<=n; i++) {
      cnt[i][j+1] = (cnt[i][j+1]+h[i]*unmaxsize%mods*fact[i+2]%mods)%mods;
    }
  }

  ll ans=0;
  for (int i=0; i<=n; i++) {
    ans = (ans+cnt[i][m]*calcC(n, i)%mods)%mods;
  }
  printf("%lld", ans);

  fclose(stdin);
  fclose(stdout);
  return 0;
}
